Vite యొక్క ప్లగిన్ ఆర్కిటెక్చర్ను అన్వేషించండి మరియు మీ డెవలప్మెంట్ వర్క్ఫ్లోను మెరుగుపరచడానికి కస్టమ్ ప్లగిన్లను ఎలా సృష్టించాలో నేర్చుకోండి. గ్లోబల్ ప్రేక్షకులకు ఆచరణాత్మక ఉదాహరణలతో అవసరమైన భావనలను నైపుణ్యం పొందండి.
Vite ప్లగిన్ ఆర్కిటెక్చర్ను సులభంగా అర్థం చేసుకోవడం: కస్టమ్ ప్లగిన్ సృష్టి కోసం ఒక గ్లోబల్ గైడ్
వైట్ (Vite), మెరుపు వేగవంతమైన బిల్డ్ టూల్, ఫ్రంటెండ్ డెవలప్మెంట్లో విప్లవాత్మక మార్పులు తెచ్చింది. దీని వేగం మరియు సరళత దాని శక్తివంతమైన ప్లగిన్ ఆర్కిటెక్చర్ కారణంగానే. ఈ ఆర్కిటెక్చర్ డెవలపర్లకు వైట్ యొక్క కార్యాచరణను విస్తరించడానికి మరియు వారి నిర్దిష్ట ప్రాజెక్ట్ అవసరాలకు అనుగుణంగా దానిని మార్చుకోవడానికి అనుమతిస్తుంది. ఈ గైడ్ వైట్ యొక్క ప్లగిన్ సిస్టమ్ను సమగ్రంగా వివరిస్తుంది, మీ స్వంత కస్టమ్ ప్లగిన్లను సృష్టించడానికి మరియు మీ డెవలప్మెంట్ వర్క్ఫ్లోను ఆప్టిమైజ్ చేయడానికి మీకు శక్తినిస్తుంది.
వైట్ యొక్క ముఖ్య సూత్రాలను అర్థం చేసుకోవడం
ప్లగిన్ సృష్టిలోకి వెళ్లే ముందు, వైట్ యొక్క ప్రాథమిక సూత్రాలను గ్రహించడం చాలా అవసరం:
- ఆన్-డిమాండ్ కంపైలేషన్: బ్రౌజర్ అభ్యర్థించినప్పుడు మాత్రమే వైట్ కోడ్ను కంపైల్ చేస్తుంది, దీనివల్ల స్టార్టప్ సమయం గణనీయంగా తగ్గుతుంది.
- నేటివ్ ESM: వైట్ డెవలప్మెంట్ కోసం నేటివ్ ECMAScript మాడ్యూల్స్ (ESM) ను ఉపయోగిస్తుంది, దీనివల్ల డెవలప్మెంట్ సమయంలో బండ్లింగ్ అవసరం తొలగిపోతుంది.
- రోలప్-ఆధారిత ప్రొడక్షన్ బిల్డ్: ప్రొడక్షన్ బిల్డ్ల కోసం, వైట్ రోలప్ను ఉపయోగిస్తుంది, ఇది అధికంగా ఆప్టిమైజ్ చేయబడిన బండ్లర్, సమర్థవంతమైన మరియు ప్రొడక్షన్కు సిద్ధంగా ఉన్న కోడ్ను ఉత్పత్తి చేయడానికి.
వైట్ ఎకోసిస్టమ్లో ప్లగిన్ల పాత్ర
వైట్ యొక్క ప్లగిన్ ఆర్కిటెక్చర్ అధికంగా విస్తరించగలిగేలా రూపొందించబడింది. ప్లగిన్లు ఇవి చేయగలవు:
- కోడ్ను మార్చడం (ఉదా., టైప్స్క్రిప్ట్ను ట్రాన్స్పైల్ చేయడం, ప్రీప్రాసెసర్లను జోడించడం).
- కస్టమ్ ఫైల్లను సర్వ్ చేయడం (ఉదా., స్టాటిక్ ఆస్తులను నిర్వహించడం, వర్చువల్ మాడ్యూల్లను సృష్టించడం).
- బిల్డ్ ప్రక్రియను సవరించడం (ఉదా., చిత్రాలను ఆప్టిమైజ్ చేయడం, సర్వీస్ వర్కర్లను ఉత్పత్తి చేయడం).
- వైట్ యొక్క CLIని విస్తరించడం (ఉదా., కస్టమ్ కమాండ్లను జోడించడం).
సాధారణ మార్పుల నుండి సంక్లిష్టమైన ఇంటిగ్రేషన్ల వరకు, వివిధ ప్రాజెక్ట్ అవసరాలకు వైట్ను అనుగుణంగా మార్చడంలో ప్లగిన్లు కీలకం.
Vite ప్లగిన్ ఆర్కిటెక్చర్: ఒక లోతైన విశ్లేషణ
ఒక వైట్ ప్లగిన్ ప్రాథమికంగా ఒక జావాస్క్రిప్ట్ ఆబ్జెక్ట్, ఇది దాని ప్రవర్తనను నిర్వచించే నిర్దిష్ట ప్రాపర్టీలను కలిగి ఉంటుంది. ముఖ్య అంశాలను పరిశీలిద్దాం:
ప్లగిన్ కాన్ఫిగరేషన్
`vite.config.js` (లేదా `vite.config.ts`) ఫైల్లో మీరు మీ వైట్ ప్రాజెక్ట్ను కాన్ఫిగర్ చేస్తారు, ఇందులో ఏ ప్లగిన్లను ఉపయోగించాలో కూడా పేర్కొంటారు. `plugins` ఆప్షన్ ప్లగిన్ ఆబ్జెక్ట్ల శ్రేణిని లేదా ప్లగిన్ ఆబ్జెక్ట్లను తిరిగి ఇచ్చే ఫంక్షన్లను అంగీకరిస్తుంది.
// vite.config.js
import myPlugin from './my-plugin';
export default {
plugins: [
myPlugin(), // ప్లగిన్ ఇన్స్టాన్స్ను సృష్టించడానికి ప్లగిన్ ఫంక్షన్ను కాల్ చేయండి
],
};
ప్లగిన్ ఆబ్జెక్ట్ ప్రాపర్టీలు
ఒక వైట్ ప్లగిన్ ఆబ్జెక్ట్ బిల్డ్ ప్రక్రియలోని వివిధ దశలలో దాని ప్రవర్తనను నిర్వచించే అనేక ప్రాపర్టీలను కలిగి ఉండవచ్చు. ఇక్కడ అత్యంత సాధారణ ప్రాపర్టీల విచ్ఛిన్నం ఉంది:
- name: ప్లగిన్ కోసం ఒక ప్రత్యేకమైన పేరు. ఇది అవసరం మరియు డీబగ్గింగ్ మరియు వైరుధ్యాల పరిష్కారానికి సహాయపడుతుంది. ఉదాహరణ: `'my-custom-plugin'`
- enforce: ప్లగిన్ యొక్క ఎగ్జిక్యూషన్ ఆర్డర్ను నిర్ధారిస్తుంది. సాధ్యమైన విలువలు `'pre'` (కోర్ ప్లగిన్లకు ముందు రన్ అవుతుంది), `'normal'` (డిఫాల్ట్), మరియు `'post'` (కోర్ ప్లగిన్ల తర్వాత రన్ అవుతుంది). ఉదాహరణ: `'pre'`
- config: వైట్ యొక్క కాన్ఫిగరేషన్ ఆబ్జెక్ట్ను సవరించడానికి అనుమతిస్తుంది. ఇది యూజర్ కాన్ఫిగ్ మరియు ఎన్విరాన్మెంట్ (మోడ్ మరియు కమాండ్) ను అందుకుంటుంది. ఉదాహరణ: `config: (config, { mode, command }) => { ... }`
- configResolved: వైట్ కాన్ఫిగ్ పూర్తిగా పరిష్కరించబడిన తర్వాత పిలువబడుతుంది. చివరి కాన్ఫిగ్ ఆబ్జెక్ట్ను యాక్సెస్ చేయడానికి ఉపయోగపడుతుంది. ఉదాహరణ: `configResolved(config) { ... }`
- configureServer: డెవలప్మెంట్ సర్వర్ ఇన్స్టాన్స్ (Connect/Express-లాంటిది) కు యాక్సెస్ ఇస్తుంది. కస్టమ్ మిడిల్వేర్ను జోడించడానికి లేదా సర్వర్ ప్రవర్తనను సవరించడానికి ఉపయోగపడుతుంది. ఉదాహరణ: `configureServer(server) { ... }`
- transformIndexHtml: `index.html` ఫైల్ను మార్చడానికి అనుమతిస్తుంది. స్క్రిప్ట్లు, స్టైల్స్ లేదా మెటా ట్యాగ్లను ఇంజెక్ట్ చేయడానికి ఉపయోగపడుతుంది. ఉదాహరణ: `transformIndexHtml(html) { ... }`
- resolveId: మాడ్యూల్ రిజల్యూషన్ను అడ్డగించి, సవరించడానికి అనుమతిస్తుంది. కస్టమ్ మాడ్యూల్ రిజల్యూషన్ లాజిక్ కోసం ఉపయోగపడుతుంది. ఉదాహరణ: `resolveId(source, importer) { ... }`
- load: కస్టమ్ మాడ్యూల్లను లోడ్ చేయడానికి లేదా ఉన్న మాడ్యూల్ కంటెంట్ను సవరించడానికి అనుమతిస్తుంది. వర్చువల్ మాడ్యూల్స్ లేదా కస్టమ్ లోడర్ల కోసం ఉపయోగపడుతుంది. ఉదాహరణ: `load(id) { ... }`
- transform: మాడ్యూల్స్ యొక్క సోర్స్ కోడ్ను మారుస్తుంది. బాబెల్ ప్లగిన్ లేదా పోస్ట్సిఎస్ఎస్ ప్లగిన్లాంటిది. ఉదాహరణ: `transform(code, id) { ... }`
- buildStart: బిల్డ్ ప్రక్రియ ప్రారంభంలో పిలువబడుతుంది. ఉదాహరణ: `buildStart() { ... }`
- buildEnd: బిల్డ్ ప్రక్రియ పూర్తయిన తర్వాత పిలువబడుతుంది. ఉదాహరణ: `buildEnd() { ... }`
- closeBundle: బండిల్ డిస్క్కు వ్రాయబడిన తర్వాత పిలువబడుతుంది. ఉదాహరణ: `closeBundle() { ... }`
- writeBundle: బండిల్ను డిస్క్కు వ్రాసే ముందు పిలువబడుతుంది, సవరణకు అనుమతిస్తుంది. ఉదాహరణ: `writeBundle(options, bundle) { ... }`
- renderError: డెవ్ సమయంలో కస్టమ్ ఎర్రర్ పేజీలను రెండర్ చేయడానికి అనుమతిస్తుంది. ఉదాహరణ: `renderError(error, req, res) { ... }`
- handleHotUpdate: HMR పై సూక్ష్మ నియంత్రణను అనుమతిస్తుంది. ఉదాహరణ: `handleHotUpdate({ file, server }) { ... }`
ప్లగిన్ హుక్స్ మరియు ఎగ్జిక్యూషన్ ఆర్డర్
వైట్ ప్లగిన్లు బిల్డ్ ప్రక్రియలోని వివిధ దశలలో ట్రిగ్గర్ అయ్యే హుక్ల శ్రేణి ద్వారా పనిచేస్తాయి. ఈ హుక్లు ఏ క్రమంలో అమలు చేయబడతాయో అర్థం చేసుకోవడం సమర్థవంతమైన ప్లగిన్లను వ్రాయడానికి చాలా ముఖ్యం.
- config: వైట్ కాన్ఫిగ్ను సవరించండి.
- configResolved: పరిష్కరించబడిన కాన్ఫిగ్ను యాక్సెస్ చేయండి.
- configureServer: డెవ్ సర్వర్ను సవరించండి (డెవలప్మెంట్ మాత్రమే).
- transformIndexHtml: `index.html` ఫైల్ను మార్చండి.
- buildStart: బిల్డ్ ప్రక్రియ ప్రారంభం.
- resolveId: మాడ్యూల్ ఐడిలను పరిష్కరించండి.
- load: మాడ్యూల్ కంటెంట్ను లోడ్ చేయండి.
- transform: మాడ్యూల్ కోడ్ను మార్చండి.
- handleHotUpdate: హాట్ మాడ్యూల్ రీప్లేస్మెంట్ (HMR) ను నిర్వహించండి.
- writeBundle: డిస్క్కు వ్రాసే ముందు అవుట్పుట్ బండిల్ను సవరించండి.
- closeBundle: అవుట్పుట్ బండిల్ డిస్క్కు వ్రాయబడిన తర్వాత పిలువబడుతుంది.
- buildEnd: బిల్డ్ ప్రక్రియ ముగింపు.
మీ మొదటి కస్టమ్ వైట్ ప్లగిన్ను సృష్టించడం
ప్రొడక్షన్ బిల్డ్లోని ప్రతి జావాస్క్రిప్ట్ ఫైల్ పైభాగంలో ఒక బ్యానర్ను జోడించే ఒక సాధారణ వైట్ ప్లగిన్ను సృష్టిద్దాం. ఈ బ్యానర్లో ప్రాజెక్ట్ పేరు మరియు వెర్షన్ ఉంటాయి.
ప్లగిన్ ఇంప్లిమెంటేషన్
// banner-plugin.js
import { readFileSync } from 'node:fs';
import { resolve } from 'node:path';
export default function bannerPlugin() {
return {
name: 'banner-plugin',
apply: 'build',
transform(code, id) {
if (!id.endsWith('.js')) {
return code;
}
const packageJsonPath = resolve(process.cwd(), 'package.json');
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
const banner = `/**\n * Project: ${packageJson.name}\n * Version: ${packageJson.version}\n */\n`;
return banner + code;
},
};
}
వివరణ:
- name: ప్లగిన్ పేరును 'banner-plugin' గా నిర్వచిస్తుంది.
- apply: ఈ ప్లగిన్ కేవలం బిల్డ్ ప్రక్రియ సమయంలో మాత్రమే రన్ అవ్వాలని నిర్దేశిస్తుంది. దీనిని 'build' కు సెట్ చేయడం వలన ఇది ప్రొడక్షన్-మాత్రమే అవుతుంది, డెవలప్మెంట్ సమయంలో అనవసరమైన ఓవర్హెడ్ను నివారిస్తుంది.
- transform(code, id):
- ఇది ప్లగిన్ యొక్క ముఖ్య భాగం. ఇది ప్రతి మాడ్యూల్ యొక్క కోడ్ (`code`) మరియు ఐడి (`id`) ను అడ్డగిస్తుంది.
- షరతులతో కూడిన తనిఖీ: `if (!id.endsWith('.js'))` రూపాంతరం జావాస్క్రిప్ట్ ఫైల్లకు మాత్రమే వర్తిస్తుందని నిర్ధారిస్తుంది. ఇది ఇతర ఫైల్ రకాలను (CSS లేదా HTML వంటివి) ప్రాసెస్ చేయకుండా నిరోధిస్తుంది, ఇది లోపాలు లేదా అనూహ్య ప్రవర్తనకు కారణం కావచ్చు.
- Package.json యాక్సెస్:
- `resolve(process.cwd(), 'package.json')` `package.json` ఫైల్కు సంపూర్ణ మార్గాన్ని నిర్మిస్తుంది. `process.cwd()` ప్రస్తుత వర్కింగ్ డైరెక్టరీని తిరిగి ఇస్తుంది, కమాండ్ ఎక్కడ అమలు చేయబడినా సరైన మార్గం ఉపయోగించబడుతుందని నిర్ధారిస్తుంది.
- `JSON.parse(readFileSync(packageJsonPath, 'utf-8'))` `package.json` ఫైల్ను చదివి, పార్స్ చేస్తుంది. `readFileSync` ఫైల్ను సింక్రోనస్గా చదువుతుంది, మరియు `'utf-8'` యూనికోడ్ అక్షరాలను సరిగ్గా నిర్వహించడానికి ఎన్కోడింగ్ను నిర్దేశిస్తుంది. ఇక్కడ సింక్రోనస్ రీడింగ్ ఆమోదయోగ్యమైనది, ఎందుకంటే ఇది ట్రాన్స్ఫార్మ్ ప్రారంభంలో ఒకసారి జరుగుతుంది.
- బ్యానర్ జనరేషన్:
- ``const banner = `/**\n * Project: ${packageJson.name}\n * Version: ${packageJson.version}\n */\n`;`` బ్యానర్ స్ట్రింగ్ను సృష్టిస్తుంది. ఇది `package.json` ఫైల్ నుండి ప్రాజెక్ట్ పేరు మరియు వెర్షన్ను సులభంగా పొందుపరచడానికి టెంప్లేట్ లిటరల్స్ (బ్యాక్టిక్స్) ను ఉపయోగిస్తుంది. `\n` సీక్వెన్సులు బ్యానర్ను సరిగ్గా ఫార్మాట్ చేయడానికి కొత్త లైన్లను చేర్చుతాయి. `*` `\*` తో ఎస్కేప్ చేయబడింది.
- కోడ్ రూపాంతరం: `return banner + code;` అసలు జావాస్క్రిప్ట్ కోడ్కు ముందు బ్యానర్ను జోడిస్తుంది. ఇది ట్రాన్స్ఫార్మ్ ఫంక్షన్ ద్వారా తిరిగి ఇవ్వబడిన చివరి ఫలితం.
ప్లగిన్ను ఇంటిగ్రేట్ చేయడం
మీ `vite.config.js` ఫైల్లోకి ప్లగిన్ను ఇంపోర్ట్ చేసి, దాన్ని `plugins` శ్రేణికి జోడించండి:
// vite.config.js
import bannerPlugin from './banner-plugin';
export default {
plugins: [
bannerPlugin(),
],
};
బిల్డ్ రన్ చేయడం
ఇప్పుడు, `npm run build` (లేదా మీ ప్రాజెక్ట్ బిల్డ్ కమాండ్) రన్ చేయండి. బిల్డ్ పూర్తయిన తర్వాత, `dist` డైరెక్టరీలోని ఉత్పత్తి చేయబడిన జావాస్క్రిప్ట్ ఫైల్లను తనిఖీ చేయండి. మీరు ప్రతి ఫైల్ పైభాగంలో బ్యానర్ను చూస్తారు.
అధునాతన ప్లగిన్ టెక్నిక్స్
సాధారణ కోడ్ రూపాంతరాలకు మించి, వైట్ ప్లగిన్లు వాటి సామర్థ్యాలను మెరుగుపరచడానికి మరింత అధునాతన టెక్నిక్లను ఉపయోగించుకోవచ్చు.
వర్చువల్ మాడ్యూల్స్
వర్చువల్ మాడ్యూల్స్ ప్లగిన్లకు డిస్క్లో వాస్తవ ఫైల్లుగా లేని మాడ్యూల్లను సృష్టించడానికి అనుమతిస్తాయి. ఇది డైనమిక్ కంటెంట్ను ఉత్పత్తి చేయడానికి లేదా అప్లికేషన్కు కాన్ఫిగరేషన్ డేటాను అందించడానికి ఉపయోగపడుతుంది.
// virtual-module-plugin.js
export default function virtualModulePlugin(options) {
const virtualModuleId = 'virtual:my-module';
const resolvedVirtualModuleId = '\0' + virtualModuleId; // రోలప్ ప్రాసెస్ చేయకుండా నిరోధించడానికి \0 తో ప్రిఫిక్స్ చేయండి
return {
name: 'virtual-module-plugin',
resolveId(id) {
if (id === virtualModuleId) {
return resolvedVirtualModuleId;
}
},
load(id) {
if (id === resolvedVirtualModuleId) {
return `export default ${JSON.stringify(options)};`;
}
},
};
}
ఈ ఉదాహరణలో:
- `virtualModuleId` అనేది వర్చువల్ మాడ్యూల్ యొక్క ఐడెంటిఫైయర్ను సూచించే ఒక స్ట్రింగ్.
- `resolvedVirtualModuleId` రోలప్ దానిని నిజమైన ఫైల్గా ప్రాసెస్ చేయకుండా నిరోధించడానికి `\0` తో ప్రిఫిక్స్ చేయబడింది. ఇది రోలప్ ప్లగిన్లలో ఉపయోగించే ఒక సంప్రదాయం.
- `resolveId` మాడ్యూల్ రిజల్యూషన్ను అడ్డగిస్తుంది మరియు అభ్యర్థించిన ఐడి `virtualModuleId` తో సరిపోలితే పరిష్కరించబడిన వర్చువల్ మాడ్యూల్ ఐడిని తిరిగి ఇస్తుంది.
- `load` మాడ్యూల్ లోడింగ్ను అడ్డగిస్తుంది మరియు అభ్యర్థించిన ఐడి `resolvedVirtualModuleId` తో సరిపోలితే మాడ్యూల్ యొక్క కోడ్ను తిరిగి ఇస్తుంది. ఈ సందర్భంలో, ఇది `options` ను డిఫాల్ట్ ఎగుమతిగా ఎగుమతి చేసే జావాస్క్రిప్ట్ మాడ్యూల్ను ఉత్పత్తి చేస్తుంది.
వర్చువల్ మాడ్యూల్ను ఉపయోగించడం
// vite.config.js
import virtualModulePlugin from './virtual-module-plugin';
export default {
plugins: [
virtualModulePlugin({ message: 'Hello from virtual module!' }),
],
};
// main.js
import message from 'virtual:my-module';
console.log(message.message); // అవుట్పుట్: Hello from virtual module!
ఇండెక్స్ HTML ను మార్చడం
`transformIndexHtml` హుక్ `index.html` ఫైల్ను సవరించడానికి మిమ్మల్ని అనుమతిస్తుంది, ఉదాహరణకు స్క్రిప్ట్లు, స్టైల్స్ లేదా మెటా ట్యాగ్లను ఇంజెక్ట్ చేయడం. ఇది అనలిటిక్స్ ట్రాకింగ్ను జోడించడానికి, సోషల్ మీడియా మెటాడేటాను కాన్ఫిగర్ చేయడానికి లేదా HTML నిర్మాణాన్ని అనుకూలీకరించడానికి ఉపయోగపడుతుంది.
// inject-script-plugin.js
export default function injectScriptPlugin() {
return {
name: 'inject-script-plugin',
transformIndexHtml(html) {
return html.replace(
'